<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Bottom-Up-Heapsort</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Bottom-Up-Heapsort"> <link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Bottom-Up-Heapsort rootpage-Bottom-Up-Heapsort skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Bottom-Up-Heapsort</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p><b>BottomUp-Heapsort</b> ist ein <a href="Sortierverfahren" title="Sortierverfahren">Sortieralgorithmus</a>, der u. a. <a href="1990" title="1990">1990</a> von <a href="Ingo_Wegener" title="Ingo Wegener">Ingo Wegener</a> vorgestellt wurde und im Durchschnitt besser als <a href="Quicksort" title="Quicksort">Quicksort</a> arbeitet,
falls man Vergleichsoperationen hinreichend stark gewichtet. Es ist eine Variante von <a href="Heapsort" title="Heapsort">Heapsort</a>, die vor allem zur Sortierung sehr großer Datenmengen geeignet ist, wenn (im Vergleich zu den notwendigen Vertauschungsoperationen) ein relativ hoher Aufwand pro Vergleichsoperation erforderlich ist.
</p><p>Diese Variante wurde allerdings bereits <a href="1986" title="1986">1986</a> von Svante Carlsson analysiert,
der letztlich eine weitere Variante fand, die sogar eine <a href="Zeitkomplexit%C3%A4t" title="Zeitkomplexität">worst-case</a>-Laufzeit von nur <i>n</i> log <i>n</i> + O(<i>n </i> log log <i>n</i>) Vergleichen hat. Entdeckt wurde dieser Bottom-Up-Heapsort bereits von <a href="Robert_Floyd" title="Robert Floyd">Robert W Floyd</a> (bei einer Überarbeitung des ursprünglichen
Heapsorts von Williams), der aber das Laufzeitverhalten dieser Variante nicht beweisen konnte.
</p><p>Er benötigt zum Sortieren einer Folge von n Schlüsseln
im schlechtesten Fall nur 1,5 <i>n</i> log <i>n</i> + 2<i>n</i> Schlüsselvergleiche.
Im Durchschnittsfall benötigt BottomUp-Heapsort nur <i>n</i> log <i>n</i> + O(<i>n</i>) Schlüsselvergleiche.
</p>
<div class="mw-heading mw-heading2"><h2 id="Prinzip_der_Sortierung">Prinzip der Sortierung</h2></div>
<p>Beim Sortieren mit normalem Heapsort finden beim Absenken eines Elements zwei Vergleiche pro Ebene statt:
</p>
<ol><li>Welcher der beiden Nachfolgeknoten des abzusenkenden Elements ist größer?</li>
<li>Ist der nun bestimmte Nachfolgeknoten größer als das abzusenkende Element?</li></ol>
<p>Nachdem ein <a href="Bin%C3%A4rbaum" title="Binärbaum">Binärbaum</a> zur Hälfte aus <a href="Blatt_(Graphentheorie)" class="mw-redirect" title="Blatt (Graphentheorie)">Blättern</a> besteht und zudem beim Sortieren ehemalige Blätter mit ohnehin schon eher niedrigen Werten abgesenkt werden, ist es wahrscheinlich, dass ein Element bis zur Blattebene oder in deren Nähe abgesenkt werden muss. Deshalb kann es lohnend sein, auf den zweiten Vergleich zu verzichten und auf Verdacht bis zur Blattebene abzusenken.
</p><p>In einem zweiten Schritt wird dann rückwärts überprüft, wie weit das Element wieder angehoben werden muss. Im günstigsten Fall (sehr große Felder mit nur wenigen <a href="Dublette_(Datenbank)" title="Dublette (Datenbank)">Dubletten</a>) kann dabei fast die Hälfte der insgesamt nötigen Vergleiche bei mäßigem Zusatzaufwand eingespart werden.
</p><p>Weniger geeignet ist BottomUp-Heapsort zur Sortierung kleinerer Felder mit einfacher numerischer Vergleichsoperation und dann, wenn im Feld sehr viele Elemente gleichwertig sind (dann stimmt die Annahme nicht, dass meist bis in die Nähe der Blattebene abgesenkt werden muss).
</p>
<div class="mw-heading mw-heading2"><h2 id="Algorithmus">Algorithmus</h2></div>
<p>Konkret wird der Heapsort-Algorithmus, was das Absenken betrifft, wie folgt verändert:
</p><p>Zunächst wird der Pfad, in welchem das Wurzelelement versenkt werden soll, bestimmt. Dies geschieht durch die Ermittlung des jeweils größten Kindes (Pfad maximaler Kinder). Danach wird dieser bestimmte Pfad von unten nach oben (vom Blatt in Richtung Wurzel) durchlaufen. Hierbei wird bei jedem besuchten Knoten verglichen, ob er größer als das abzusenkende Wurzelelement ist. Ist dem so, wird das Wurzelelement an die Position des zuletzt besuchten Knotens kopiert und vorher der restliche Pfad um eine Ebene nach oben verschoben.
</p><p>Alternativ kann man auch die Verschiebung von vornherein auf Verdacht bis zur Blattebene durchführen und später – soweit notwendig – wieder rückgängig machen. Wo Kopien relativ günstig durchgeführt werden können (weil etwa nur ein <a href="Zeiger_(Informatik)" title="Zeiger (Informatik)">Zeiger</a> kopiert wird), kann das insgesamt vorteilhaft sein.
</p>
<div class="mw-heading mw-heading2"><h2 id="Beispiel">Beispiel</h2></div>
<p><b>Heap</b>: [9, 23, 24, 20, 18, 14, 17, 13, 15, 11, 10, 5, 7, 3, 2]
</p><p><b>Baumstruktur:</b>
</p>
<p>Das Element <b>9</b> muss abgesenkt werden, da es kleiner als mindestens ein Nachfolgeknoten ist.
Es wird als erstes der Pfad der maximalen Kinder (ausgehend von der Wurzel) bestimmt. Es ergibt sich also <b>9 - 24 - 17 - 3</b>.
Der Algorithmus durchläuft diesen Pfad nun von unten nach oben, also <b>3 → 17 → 24 → 9</b>. Nun wird der Pfad vom Blattknoten <b>(3)</b> beginnend solange durchlaufen, bis sich ein Knoten findet, der größer als <b>9</b> ist. Der Durchlauf endet folglich bei <b>17</b>. Nun werden alle Knoten ab <b>17</b> bis zum Nachfolgeknoten der Wurzel <b>(= 17 → 24)</b> um eine Ebene nach oben und der Knoten <b>9</b> an die Position von <b>17</b> verschoben. Folglich ändern <b>17</b> und <b>24</b> als Nachfolgeknoten und <b>9</b> als Wurzelknoten ihren Platz.
</p><p><b>Heap</b>: [24, 23, 17, 20, 18, 14, 9, 13, 15, 11, 10, 5, 7, 3, 2]
</p><p><b>Baumstruktur:</b>
</p>
<style data-mw-deduplicate="TemplateStyles:r256979673">
/* start https://de.wikipedia.org/ */
.mw-parser-output .vl-mehrere-bilder{margin-top:.5em}.mw-parser-output .vl-mehrere-bilder-kopf{clear:both;font-weight:bold}.mw-parser-output .vl-mehrere-bilder-horizontal{float:left;padding:1px}@media screen{html.skin-theme-clientpref-night .mw-parser-output .vl-mehrere-bilder .thumbimage{background:none}html.skin-theme-clientpref-night .mw-parser-output .vl-mehrere-bilder .thumbimage:not([style*="background"]) span:not([class]) img{background-color:var(--background-color-base-fixed,#ffffff);color:var(--color-base-fixed,#202122);filter:brightness(0.8)}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .vl-mehrere-bilder .thumbimage{background:none}html.skin-theme-clientpref-os .mw-parser-output .vl-mehrere-bilder .thumbimage:not([style*="background"]) span:not([class]) img{background-color:var(--background-color-base-fixed,#ffffff);color:var(--color-base-fixed,#202122);filter:brightness(0.8)}}
/* end https://de.wikipedia.org/ */
</style><div class="thumb tleft vl-mehrere-bilder" style="width:522px;"><div class="thumbinner"><div class="vl-mehrere-bilder-horizontal" style="width:254px;"><div class="thumbimage"><span typeof="mw:File"></span></div></div><div class="vl-mehrere-bilder-horizontal" style="width:254px;"><div class="thumbimage"><span typeof="mw:File"></span></div></div><div style="clear:both;"></div>
<div style="clear:both;"></div>
</div></div>
<div style="clear:both"></div>
<div class="mw-heading mw-heading2"><h2 id="Implementierung">Implementierung</h2></div>
<p>Einfache Beispielsimplementierung in <a href="Varianten_der_Programmiersprache_C#C99" title="Varianten der Programmiersprache C">C99</a>:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">heapsort_bu</span><span class="p">(</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">data</span><span class="p">[],</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="c1">// zu sortierendes Feld und seine Länge</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">val</span><span class="p">,</span><span class="w"> </span><span class="n">parent</span><span class="p">,</span><span class="w"> </span><span class="n">child</span><span class="p">;</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">root</span><span class="o">=</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">>></span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="c1">// erstes Blatt im Baum</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count</span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="c1">// Zähler für Anzahl der Vergleiche</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// Teil 1: Konstruktion des Heaps</span>
<span class="w"> </span><span class="n">parent</span><span class="o">=</span><span class="w"> </span><span class="o">--</span><span class="n">root</span><span class="p">;</span>
<span class="w"> </span><span class="n">val</span><span class="o">=</span><span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">root</span><span class="p">];</span><span class="w"> </span><span class="c1">// zu versickernder Wert</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">else</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="o">--</span><span class="n">n</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// Teil 2: eigentliche Sortierung</span>
<span class="w"> </span><span class="n">val</span><span class="o">=</span><span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">n</span><span class="p">];</span><span class="w"> </span><span class="c1">// zu versickernder Wert vom Heap-Ende</span>
<span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">n</span><span class="p">]</span><span class="o">=</span><span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span><span class="w"> </span><span class="c1">// Spitze des Heaps hinter den Heap in</span>
<span class="w"> </span><span class="n">parent</span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="c1">// den sortierten Bereich verschieben</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="c1">// Heap ist leer; Sortierung beendet</span>
<span class="w"> </span><span class="k">break</span><span class="p">;</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="p">(</span><span class="n">child</span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">parent</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="c1">// zweites (!) Kind;</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// Abbruch am Ende des Heaps</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="o">++</span><span class="n">count</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">child</span><span class="mi">-1</span><span class="p">]</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">child</span><span class="p">]</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="c1">// größeres Kind wählen</span>
<span class="w"> </span><span class="o">--</span><span class="n">child</span><span class="p">;</span>
<span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">parent</span><span class="p">]</span><span class="o">=</span><span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">child</span><span class="p">];</span><span class="w"> </span><span class="c1">// größeres Kind nach oben rücken</span>
<span class="w"> </span><span class="n">parent</span><span class="o">=</span><span class="w"> </span><span class="n">child</span><span class="p">;</span><span class="w"> </span><span class="c1">// in der Ebene darunter weitersuchen</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">child</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="c1">// ein einzelnes Kind am Heap-Ende</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// ist übersprungen worden</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="o">++</span><span class="n">count</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="o">--</span><span class="n">child</span><span class="p">]</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="n">val</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// größer als der zu versick-</span>
<span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">parent</span><span class="p">]</span><span class="o">=</span><span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">child</span><span class="p">];</span><span class="w"> </span><span class="c1">// ernde Wert, also noch nach oben</span>
<span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">child</span><span class="p">]</span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span><span class="w"> </span><span class="c1">// versickerten Wert eintragen</span>
<span class="w"> </span><span class="k">continue</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">child</span><span class="o">=</span><span class="w"> </span><span class="n">parent</span><span class="p">;</span><span class="w"> </span><span class="c1">// 1 Ebene nach oben zurück</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">else</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="o">++</span><span class="n">count</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">parent</span><span class="p">]</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="n">val</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// das Blatt ist größer als der</span>
<span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">parent</span><span class="p">]</span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span><span class="w"> </span><span class="c1">// zu versickernde Wert, der damit</span>
<span class="w"> </span><span class="k">continue</span><span class="p">;</span><span class="w"> </span><span class="c1">// direkt eingetragen werden kann</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">child</span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">parent</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">>></span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="c1">// 2 Ebenen nach oben zurück</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">child</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="c1">// maximal zum Ausgangspunkt zurück</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">parent</span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">child</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">>></span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="c1">// den Vergleichswert haben wir bereits</span>
<span class="w"> </span><span class="c1">// nach oben verschoben</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="o">++</span><span class="n">count</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">parent</span><span class="p">]</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="n">val</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="c1">// größer als der zu versickernde</span>
<span class="w"> </span><span class="k">break</span><span class="p">;</span><span class="w"> </span><span class="c1">// Wert, also Position gefunden</span>
<span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">child</span><span class="p">]</span><span class="o">=</span><span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">parent</span><span class="p">];</span><span class="w"> </span><span class="c1">// Rückverschiebung nötig</span>
<span class="w"> </span><span class="n">child</span><span class="o">=</span><span class="w"> </span><span class="n">parent</span><span class="p">;</span><span class="w"> </span><span class="c1">// 1 Ebene nach oben zurück</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="n">child</span><span class="p">]</span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span><span class="w"> </span><span class="c1">// versickerten Wert eintragen</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">count</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
<p>Zu Vergleichszwecken gibt die Funktion die Anzahl der durchgeführten Vergleiche zurück.
</p>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li>J. W. J. Williams: <i>Algorithm 232 – Heapsort</i>. In: <i>Communications of the ACM</i>, 1964, 7(6), S. 347–348.</li>
<li>Robert W. Floyd: <i>Algorithm 245 – Treesort 3</i>. In: <i>Communications of the ACM</i>, 1964, 7(12), S. 701.</li>
<li>S. Carlsson: <i>HEAPS</i>. Doctoral dissertation, Lund Univ., Sweden 1986.</li>
<li>Svante Carlsson: <i>Average-case results on heapsort</i>. In: <i>BIT</i>, 27, 1987, no.1, S. 2–17.</li>
<li>Ingo Wegener: <i>BOTTOM-UP-HEAPSORT, a new variant of HEAPSORT beating, on an average, QUICKSORT (if n is not very small)</i>. 15th International Symposium on Mathematical Foundations of Computer Science (MFCS ’90) Banská Bystrica, 1990. In: <i>Theoret. Comput. Sci.</i>, 118, 1993, no. 1, S. 81–98.</li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-04-16" href="https://de.wikipedia.org/wiki/?title=Bottom-Up-Heapsort&oldid=255206335">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>